home *** CD-ROM | disk | FTP | other *** search
- /*
- ICComponent.c
-
- C version of the IC Component.
-
- One may wonder why I took the time to port the IC stuff to C. The simple answer is that I wanted to be able
- to extend IC to handle some Internet services that I am bringing online. Since I don't have a pascal compiler
- (and since I prefer C), I first had to port IC before I could begin extending it.
-
- The original comment for the pascal file follows...
-
- History:
- 11/06/95 - dhn - Began C port.
-
- */
-
- /* Original Comment:
- (* File: ICComponent.p
- * Generated by: 1.0d4
- * For: IC 1.2
- * On: Monday, 25 September 1995, 19:28:12
- *
- * This file is part of the Internet Configuration system and
- * is placed in the public domain for the benefit of all.
- *)
- */
-
- #include <Components.h>
- #include <Types.h>
- #include <Files.h>
- #include <Memory.h>
- #include <Errors.h>
- #include <ToolUtils.h>
- #include <AppleTalk.h>
- #include <Aliases.h>
-
- #if USESROUTINEDESCRIPTORS
- #include <stdlib.h>
- #endif
-
- #include "IC Types.h"
- #include "IC Keys.h"
- #include "IC Link In Subs.h"
- #include "IC Resource API.h"
- #include "IC Component API.h"
- #include "IC Component Selectors.h"
-
- #include "IC Component.h"
-
- ICError GetStringFromResourceFile(GlobalsHandle globals,short id,StringPtr name){
- ICError err;
- short refnum;
- StringHandle strh;
-
- err=(ICError)noErr;
- name[0]=0;
-
- #ifndef DEBUG_IC_COMPONENT
- /*
- When debugging the IC component, the res file is not registered with the Component
- Manager. However, we don't want this to disable our debugging.
-
- Simple solution: Add the resource to the project file and conditionally compile the open
- and close resource file stuff.
- */
- refnum=OpenComponentResFile((Component)(*globals)->self);
-
- if (refnum<=0){
- return resNotFound;
- }
- #endif
-
- strh=GetString(id);
- if (strh==(StringHandle)0){
- err=resNotFound;
- } else {
- HLock((Handle)strh);
- BlockMoveData((Ptr)*strh,(Ptr)name,(*strh)[0]+1);
- HUnlock((Handle)strh);
-
- err=noErr;
- }
-
- #ifndef DEBUG_IC_COMPONENT
- CloseComponentResFile(refnum);
- #endif
-
- return err;
- }
-
- // Component Manager Routines
- pascal ComponentResult ICCICanDo(GlobalsHandle globals,short selector){
- ComponentResult cr=(ComponentResult)0;
-
- if ((selector>=kComponentVersionSelect)&&(selector<=kComponentOpenSelect)){
- cr=(ComponentResult)1;
- } else {
- if ((selector>=kICC_first_select)&&(selector<=kICC_last_select)){
- cr=(ComponentResult)1;
- }
- }
-
- if (!cr)
- SysBeep(3);
-
- return cr;
- }
-
- pascal ComponentResult ICCIOpen(GlobalsHandle globals,ComponentInstance self){
- ComponentResult err;
-
- globals=(GlobalsHandle)NewHandle(sizeof(GlobalsRecord));
- if (globals==(GlobalsHandle)0){
- err=MemError();
- } else {
- (*globals)->self=self;
- (*globals)->current_target=self;
-
- SetComponentInstanceStorage(self,(Handle)globals);
- err=(ComponentResult)noErr;
- }
-
- return err;
- }
-
- pascal ComponentResult ICCIClose(GlobalsHandle globals,ComponentInstance self){
- ComponentResult err=(ComponentResult)noErr;
-
- if (globals!=(GlobalsHandle)0){
- DisposeHandle((Handle)globals);
- }
-
- return err;
- }
-
- pascal ComponentResult ICCITarget(GlobalsHandle globals,ComponentInstance new_target){
- ComponentResult err=(ComponentResult)noErr;
-
- if (globals!=(GlobalsHandle)0){
- (*globals)->current_target=new_target;
- } else {
- err=(ComponentResult)paramErr;
- }
-
- return err;
- }
-
- // Internet Configuration specific routines
-
- pascal ICError ICCIStart(GlobalsHandle globals,OSType creator){
- OSErr err;
-
- err=ICRStart(&((*globals)->inst),creator);
-
- if (err==noErr){
- err=ICCDefaultFileName((*globals)->current_target,(*globals)->inst.default_filename);
- }
-
- if (err==noErr){
- err=GetStringFromResourceFile(globals,kICdefault_prompt_ID,(*globals)->inst.prompt);
- }
-
- return (ICError)err;
- }
-
- pascal ICError ICCIForceInside(GlobalsHandle globals,ICPerm perm,Boolean* force_info){
- ICError err;
- ICPerm current_perm;
-
- *force_info=false;
- current_perm=(*globals)->inst.perm;
-
- if ((current_perm==perm)||((current_perm==icReadWritePerm)&&(perm==icReadOnlyPerm))){
- err=(ICError)noErr;
- } else if (current_perm==icNoPerm){
- err=ICCBegin((*globals)->current_target,perm);
- *force_info=(err==(ICError)noErr);
- } else {
- err=(ICError)icPermErr;
- }
-
- return err;
- }
-
- pascal ICError ICCIReleaseInside(GlobalsHandle globals,Boolean force_info){
- if (force_info)
- return ICCEnd((*globals)->current_target);
-
- return (ICError)noErr;
- }
-
- /*
- The set and get routines are significantly complicated by the fact that the ICR versions can call
- ICBegin if the calling program hasn't done so already. The problem with this is that override
- component would not see these calls because the ICR code calls the code directly. The solution
- is for the component to calls these routines itself (which sends them through the override
- components. Oh god, this is confusing and it's getting worse as I try to maintain compatibility
- and putting the cache in is going to be even worse.
- */
- pascal ICError ICCIGetPref(GlobalsHandle globals,StringPtr key,ICAttr* attr,Ptr buf,long* size){
- ICError err,err2;
- Boolean force_info;
-
- err=ICCIForceInside(globals,icReadOnlyPerm,&force_info);
-
- if (err==noErr){
- err=ICRGetPref(&((*globals)->inst),key,attr,buf,size);
- }
-
- err2=ICCIReleaseInside(globals,force_info);
-
- if (err==noErr)
- err=err2;
-
- return err;
- }
-
- pascal ICError ICCISetPref(GlobalsHandle globals,StringPtr key,ICAttr attr,Ptr buf,long size){
- ICError err,err2;
- Boolean force_info;
-
- err=ICCIForceInside(globals,icReadWritePerm,&force_info);
- if (err==noErr)
- err=ICRSetPref(&((*globals)->inst),key,attr,buf,size);
-
- err2=ICCIReleaseInside(globals,force_info);
-
- if (err==noErr)
- err=err2;
-
- return err;
- }
-
- pascal ICError ICCIFindPrefHandle(GlobalsHandle globals,StringPtr key,ICAttr* attr,Handle prefh){
- ICError err,err2;
- long prefsize;
- Boolean force_info;
-
- err=noErr;
- if (prefh==(Handle)0)
- err=paramErr;
-
- prefsize=0L;
-
- if (err==noErr){
- err=ICCIForceInside(globals,icReadOnlyPerm,&force_info);
- if (err==noErr)
- err=ICCGetPref((*globals)->current_target,key,attr,nil,&prefsize);
-
- if (err==noErr){
- SetHandleSize(prefh,prefsize);
- err=MemError();
- }
-
- if (err==noErr){
- HLock(prefh);
- err=ICCGetPref((*globals)->current_target,key,attr,*prefh,&prefsize);
- HUnlock(prefh);
- }
-
- err2=ICCIReleaseInside(globals,force_info);
-
- if (err==noErr)
- err=err2;
- }
-
- if ((prefh!=(Handle)0)&&(err!=noErr)){
- SetHandleSize(prefh,0);
- }
-
- return err;
- }
-
- pascal ICError ICCIGetPrefHandle(GlobalsHandle globals,StringPtr key,ICAttr* attr,Handle* prefh){
- ICError err;
-
- *prefh=NewHandle(0);
- if (*prefh==(Handle)0)
- return MemError();
-
- err=ICCIFindPrefHandle(globals,key,attr,*prefh);
-
- if (err==icPrefNotFoundErr){
- SetHandleSize(*prefh,0);
- *attr=(ICAttr)0;
- err=noErr;
- }
-
- return err;
- }
-
- pascal ICError ICCISetPrefHandle(GlobalsHandle globals,StringPtr key,ICAttr attr,Handle prefh){
- SignedByte s;
- ICError err=noErr;
-
- if (prefh!=(Handle)0){
- if (*prefh==(Ptr)0)
- err=paramErr;
- if (err==noErr){
- s=HGetState(prefh);
- HLock(prefh);
- err=ICCSetPref((*globals)->current_target,key,attr,*prefh,GetHandleSize(prefh));
- HSetState(prefh,s);
- }
- } else {
- err=ICCSetPref((*globals)->current_target,key,attr,(Ptr)0,0);
- }
-
- return err;
- }
-
- pascal ICError ICCIDefaultFileName(GlobalsHandle globals,StringPtr name){
- ICError err;
- short refnum;
- StringHandle strh;
- Str255 s;
-
- err=GetStringFromResourceFile(globals,kICdefault_file_name_ID,s);
-
- if (err!=noErr)
- PasStrCopy(kICDefaultFileName,name);
- else
- PasStrCopy(s,name);
-
- return err;
- }
-
- pascal ICError ICCILaunchURL(GlobalsHandle globals,StringPtr hint,Ptr data,long len,long* selStart,long* selEnd){
- ICError err;
- Handle urlh;
- ICAppSpec helper;
- Str255 scheme;
- long junk_attr;
- long size;
-
- urlh=NewHandle(0);
- if (urlh==(Handle)0){
- return MemError();
- }
-
- err=ICCParseURL((*globals)->current_target,hint,data,len,selStart,selEnd,urlh);
-
- if (err==noErr){
- err=FindScheme(urlh,scheme);
- }
-
- if (err==noErr){
- Str255 conscheme;
- Ptr spos;
-
- PasStrCopy(kICHelper,conscheme);
- spos=(Ptr)(&(conscheme[conscheme[0]+1]));
-
- BlockMoveData((Ptr)(&(scheme[1])),spos,scheme[0]);
- conscheme[0]+=scheme[0];
-
- size=sizeof(helper);
- err=ICCGetPref((*globals)->current_target,conscheme,&junk_attr,(Ptr)(&helper),&size);
- }
-
- if (err==noErr){
- err=LaunchURL(helper.fCreator,urlh);
- }
-
- if (urlh!=(Handle)0){
- DisposeHandle(urlh);
- }
-
- return err;
- }
-
- pascal ICError ICCIMapFilename(GlobalsHandle globals,StringPtr filename,ICMapEntry* entry){
- ICError err;
- Handle entries;
- ICAttr junk_attr;
-
- err=(ICError)noErr;
-
- if (filename[0]==0)
- return paramErr;
-
- err=ICCGetPrefHandle((*globals)->current_target,kICMapping,&junk_attr,&entries);
-
- if (err==noErr){
- err=ICCMapEntriesFilename((*globals)->current_target,entries,filename,entry);
-
- DisposeHandle(entries);
- }
-
- return err;
- }
-
- pascal ICError ICCIMapTypeCreator(GlobalsHandle globals,OSType fType,OSType fCreator,StringPtr filename,
- ICMapEntry* entry){
- ICError err;
- Handle entries;
- ICAttr junk_attr;
-
- err=ICCGetPrefHandle((*globals)->current_target,kICMapping,&junk_attr,&entries);
-
- if (err==noErr){
- err=ICCMapEntriesTypeCreator((*globals)->current_target,entries,fType,fCreator,filename,entry);
- DisposeHandle(entries);
- }
-
- return err;
- }
-
- pascal ICError ICCIStop(GlobalsHandle globals){
- return ICRStop(&((*globals)->inst));
- }
-
- pascal ICError ICCIFindConfigFile(GlobalsHandle globals,short count,ICDirSpecArrayPtr folders){
- return ICRFindConfigFile(&((*globals)->inst),count,folders);
- }
-
- pascal ICError ICCIFindUserConfigFile(GlobalsHandle globals,ICDirSpec* where){
- return ICRFindUserConfigFile(&((*globals)->inst),where);
- }
-
- pascal ICError ICCIGeneralFindConfigFile(GlobalsHandle globals,Boolean search_prefs,Boolean can_create,short count,
- ICDirSpecArrayPtr folders){
- return ICRGeneralFindConfigFile(&((*globals)->inst),search_prefs,can_create,count,folders);
- }
-
- pascal ICError ICCIChooseConfig(GlobalsHandle globals){
- return ICRChooseConfig(&((*globals)->inst));
- }
-
- pascal ICError ICCIChooseNewConfig(GlobalsHandle globals){
- return ICRChooseNewConfig(&((*globals)->inst));
- }
-
- pascal ICError ICCIGetGonfigName(GlobalsHandle globals,Boolean longname,StringPtr name){
- return ICRGetConfigName(&((*globals)->inst),longname,name);
- }
-
- pascal ICError ICCIGetConfigReference(GlobalsHandle globals,ICConfigRefHandle ref){
- return ICRGetConfigReference(&((*globals)->inst),ref);
- }
-
- pascal ICError ICCISetConfigReference(GlobalsHandle globals,ICConfigRefHandle ref,long flags){
- return ICRSetConfigReference(&((*globals)->inst),ref,flags);
- }
-
- pascal ICError ICCISpecifyConfigFile(GlobalsHandle globals,FSSpecPtr config){
- return ICRSpecifyConfigFile(&((*globals)->inst),config);
- }
-
- pascal ICError ICCIGetSeed(GlobalsHandle globals,long* seed){
- return ICRGetSeed(&((*globals)->inst),seed);
- }
-
- pascal ICError ICCIGetPerm(GlobalsHandle globals,ICPerm* perm){
- return ICRGetPerm(&((*globals)->inst),perm);
- }
-
- pascal ICError ICCIBegin(GlobalsHandle globals,ICPerm perm){
- return ICRBegin(&((*globals)->inst),perm);
- }
-
- pascal ICError ICCICountPref(GlobalsHandle globals,long* count){
- return ICRCountPref(&((*globals)->inst),count);
- }
-
- pascal ICError ICCIGetIndPref(GlobalsHandle globals,long n,StringPtr key){
- return ICRGetIndPref(&((*globals)->inst),n,key);
- }
-
- pascal ICError ICCIDeletePref(GlobalsHandle globals,StringPtr key){
- return ICRDeletePref(&((*globals)->inst),key);
- }
-
- pascal ICError ICCIEnd(GlobalsHandle globals){
- return ICREnd(&((*globals)->inst));
- }
-
- pascal ICError ICCIEditPreferences(GlobalsHandle globals,StringPtr key){
- return ICREditPreferences(&((*globals)->inst),key);
- }
-
- pascal ICError ICCIParseURL(GlobalsHandle globals,StringPtr hint,Ptr data,long len,long* selStart,long* selEnd,
- Handle url){
- return ICRParseURL(&((*globals)->inst),hint,data,len,selStart,selEnd,url);
- }
-
- pascal ICError ICCIMapEntriesFilename(GlobalsHandle globals,Handle entries,StringPtr filename,ICMapEntry* entry){
- return ICRMapEntriesFilename(&((*globals)->inst),entries,filename,entry);
- }
-
- pascal ICError ICCIMapEntriesTypeCreator(GlobalsHandle globals,Handle entries,OSType fType,OSType fCreator,
- StringPtr filename,ICMapEntry* entry){
- return ICRMapEntriesTypeCreator(&((*globals)->inst),entries,fType,fCreator,filename,entry);
- }
-
- pascal ICError ICCICountMapEntries(GlobalsHandle globals,Handle entries,long* count){
- return ICRCountMapEntries(&((*globals)->inst),entries,count);
- }
-
- pascal ICError ICCIGetIndMapEntry(GlobalsHandle globals,Handle entries,long ndx,long* pos,ICMapEntry* entry){
- return ICRGetIndMapEntry(&((*globals)->inst),entries,ndx,pos,entry);
- }
-
- pascal ICError ICCIGetMapEntry(GlobalsHandle globals,Handle entries,long pos,ICMapEntry* entry){
- return ICRGetMapEntry(&((*globals)->inst),entries,pos,entry);
- }
-
- pascal ICError ICCISetMapEntry(GlobalsHandle globals,Handle entries,long pos,ICMapEntry* entry){
- return ICRSetMapEntry(&((*globals)->inst),entries,pos,entry);
- }
-
- pascal ICError ICCIDeleteMapEntry(GlobalsHandle globals,Handle entries,long pos){
- return ICRDeleteMapEntry(&((*globals)->inst),entries,pos);
- }
-
- pascal ICError ICCIAddMapEntry(GlobalsHandle globals,Handle entries,ICMapEntry* entry){
- return ICRAddMapEntry(&((*globals)->inst),entries,entry);
- }
-
- // ----- Component Entry Point -----
-
- /*
- "Component entry point. It's pretty neat IMHO." - IC Pascal Programmers
-
- They were correct, their component entry routine was pretty neat, but I couldn't
- duplicate it exactly. The original routine used procptrs with jumps to the appropriate
- routines. I redid it to use universal proc ptrs with the conditional macros to expand the calls.
- */
- pascal ComponentResult
- #ifdef DEBUG_IC_COMPONENT
- InternetConfig
- #else /* Not DEBUG_IC_COMPONENT */
- main
- #endif /* DEBUG_IC_COMPONENT */
- (ComponentParameters* params,Handle storage){
- ComponentFunctionUPP proc;
- SignedByte s;
- ComponentResult cres;
-
- #if USESROUTINEDESCRIPTORS
- #ifndef DEBUG_IC_COMPONENT
- __rsrcinit();
- #else
- DebugStr("\pIC Component");
-
- #endif
- #endif
-
- proc=(ComponentFunctionUPP)0;
-
- switch (params->what){
- // Component Manager Interface
-
- case kComponentVersionSelect:
- cres=internetConfigurationComponentInterfaceVersion;
- break;
- case kComponentCanDoSelect:
- proc=BuildNewProc(ICCICanDo,uppICCanDoProcInfo);
- break;
- case kComponentOpenSelect:
- proc=BuildNewProc(ICCIOpen,uppICOpenProcInfo);
- break;
- case kComponentCloseSelect:
- proc=BuildNewProc(ICCIClose,uppICCloseProcInfo);
- break;
- case kComponentTargetSelect:
- proc=BuildNewProc(ICCITarget,uppICTargetProcInfo);
- break;
-
- // Component Interface
-
- case kICCStart:
- proc=BuildNewProc(ICCIStart,uppICStartProcInfo);
- break;
- case kICCStop:
- proc=BuildNewProc(ICCIStop,uppICStopProcInfo);
- break;
- case kICCFindConfigFile:
- proc=BuildNewProc(ICCIFindConfigFile,uppICFindConfigFileProcInfo);
- break;
- case kICCFindUserConfigFile:
- proc=BuildNewProc(ICCIFindUserConfigFile,uppICFindUserConfigFileProcInfo);
- break;
- case kICCGeneralFindConfigFile:
- proc=BuildNewProc(ICCIGeneralFindConfigFile,uppICGeneralFindConfigFileProcInfo);
- break;
- case kICCGetConfigName:
- proc=BuildNewProc(ICCIGetGonfigName,uppICGetConfigNameProcInfo);
- break;
- case kICCGetConfigReference:
- proc=BuildNewProc(ICCIGetConfigReference,uppICGetConfigReferenceProcInfo);
- break;
- case kICCChooseConfig:
- proc=BuildNewProc(ICCIChooseConfig,uppICChooseConfigProcInfo);
- break;
- case kICCChooseNewConfig:
- proc=BuildNewProc(ICCIChooseNewConfig,uppICChooseNewConfigProcInfo);
- break;
- case kICCSetConfigReference:
- proc=BuildNewProc(ICCISetConfigReference,uppICSetConfigReferenceProcInfo);
- break;
- case kICCSpecifyConfigFile:
- proc=BuildNewProc(ICCISpecifyConfigFile,uppICSpecifyConfigFileProcInfo);
- break;
- case kICCGetSeed:
- proc=BuildNewProc(ICCIGetSeed,uppICGetSeedProcInfo);
- break;
- case kICCGetPerm:
- proc=BuildNewProc(ICCIGetPerm,uppICGetPermProcInfo);
- break;
- case kICCDefaultFileName:
- proc=BuildNewProc(ICCIDefaultFileName,uppICDefaultFileNameProcInfo);
- break;
- case kICCBegin:
- proc=BuildNewProc(ICCIBegin,uppICBeginProcInfo);
- break;
- case kICCGetPref:
- proc=BuildNewProc(ICCIGetPref,uppICGetPrefProcInfo);
- break;
- case kICCSetPref:
- proc=BuildNewProc(ICCISetPref,uppICSetPrefProcInfo);
- break;
- case kICCFindPrefHandle:
- proc=BuildNewProc(ICCIFindPrefHandle,uppICFindPrefHandleProcInfo);
- break;
- case kICCGetPrefHandle:
- proc=BuildNewProc(ICCIGetPrefHandle,uppICGetPrefHandleProcInfo);
- break;
- case kICCSetPrefHandle:
- proc=BuildNewProc(ICCISetPrefHandle,uppICSetPrefHandleProcInfo);
- break;
- case kICCCountPref:
- proc=BuildNewProc(ICCICountPref,uppICCountPrefProcInfo);
- break;
- case kICCGetIndPref:
- proc=BuildNewProc(ICCIGetIndPref,uppICGetIndPrefProcInfo);
- break;
- case kICCDeletePref:
- proc=BuildNewProc(ICCIDeletePref,uppICDeletePrefProcInfo);
- break;
- case kICCEnd:
- proc=BuildNewProc(ICCIEnd,uppICEndProcInfo);
- break;
- case kICCEditPreferences:
- proc=BuildNewProc(ICCIEditPreferences,uppICEditPreferencesProcInfo);
- break;
- case kICCParseURL:
- proc=BuildNewProc(ICCIParseURL,uppICParseURLProcInfo);
- break;
- case kICCLaunchURL:
- proc=BuildNewProc(ICCILaunchURL,uppICLaunchURLProcInfo);
- break;
- case kICCMapFilename:
- proc=BuildNewProc(ICCIMapFilename,uppICMapFilenameProcInfo);
- break;
- case kICCMapTypeCreator:
- proc=BuildNewProc(ICCIMapTypeCreator,uppICMapTypeCreatorProcInfo);
- break;
- case kICCMapEntriesFilename:
- proc=BuildNewProc(ICCIMapEntriesFilename,uppICMapEntriesFilenameProcInfo);
- break;
- case kICCMapEntriesTypeCreator:
- proc=BuildNewProc(ICCIMapEntriesTypeCreator,uppICMapEntriesTypeCreatorProcInfo);
- break;
- case kICCCountMapEntries:
- proc=BuildNewProc(ICCICountMapEntries,uppICCountMapEntriesProcInfo);
- break;
- case kICCGetIndMapEntry:
- proc=BuildNewProc(ICCIGetIndMapEntry,uppICGetIndMapEntryProcInfo);
- break;
- case kICCGetMapEntry:
- proc=BuildNewProc(ICCIGetMapEntry,uppICGetMapEntryProcInfo);
- break;
- case kICCSetMapEntry:
- proc=BuildNewProc(ICCISetMapEntry,uppICSetMapEntryProcInfo);
- break;
- case kICCDeleteMapEntry:
- proc=BuildNewProc(ICCIDeleteMapEntry,uppICDeleteMapEntryProcInfo);
- break;
- case kICCAddMapEntry:
- proc=BuildNewProc(ICCIAddMapEntry,uppICAddMapEntryProcInfo);
- break;
-
- default:
- cres=(ComponentResult)badComponentSelector;
- break;
- }
-
- if (proc!=(ComponentFunctionUPP)0){
- // have a proc, call it
-
- if (storage!=(Handle)0){
- s=HGetState(storage);
- HLock(storage);
- }
-
- cres=CallComponentFunctionWithStorage(storage,params,proc);
-
- DisposeRoutineDescriptor((UniversalProcPtr)proc);
-
- if ((storage!=(Handle)0)&&(params->what!=kComponentCloseSelect)){
- HSetState(storage,s);
- }
-
- }
-
- #if USESROUTINEDESCRIPTORS
- #ifndef DEBUG_IC_COMPONENT
- __rsrcterm();
- #endif
- #endif
-
- return cres;
- }
-